package com.atguigu.demojuc.chap09;

/**
 * 测试 有序性  问题
 */
public class VolatileOrderDemo {

    static volatile int a,b;
    static int x,y;

    public static void main(String[] args) throws InterruptedException {

        int i = 0; //记录循环次数
        while (true){
            i++;
            a = b = x = y = 0;

            //分析 先执行thread1\thread2： 交叉执行：   x,y=[1,1]
            //第158183次打印：x=0, y=0    如果出现指令重排序，那么，就可能出现x,y=[0,0]情况。
            // 为什么会出现指令重排序？  JVM或操作系统底层会对代码指令运行进行优化提高性能。可能会对代码指令顺序进行调整。但是，这样会出现意向不到的后果。
            //  怎么解决这个问题? 禁止指令重排。给变量增加volatile

            //分析 先执行thread1后执行thread2：    a=1  x=0   b=1   y=1         x,y=[0,1]
            Thread thread1 = new Thread(() -> {
                a = 1;
                x = b;
            }, "");

            //分析 先执行thread2后执行thread1：    b=1   y=0   a=1   x=1        x,y=[1,0]
            Thread thread2 = new Thread(() -> {
                b = 1;
                y = a;
            }, "");

            thread1.start();
            thread2.start();

            thread1.join();
            thread2.join();

            System.out.println("第" + i + "次打印：x=" + x + ", y=" + y);

            if (x == 0 && y == 0){
                break;
            }
        }
    }
}